// This is a Flutter widget test for the combined demo application.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility in the flutter_test package. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:flutter_application_basic/main.dart';

void main() {
  group('Flutter综合演示应用测试', () {
    testWidgets('主选择页面显示测试', (WidgetTester tester) async {
      // 构建我们的应用并触发一帧
      await tester.pumpWidget(MyApp());

      // 验证主选择页面的标题和关键元素存在
      expect(find.text('选择演示类型'), findsOneWidget);
      expect(find.text('图片及图标演示'), findsOneWidget);
      expect(find.text('交互组件演示'), findsOneWidget);
      expect(find.text('请选择您想要查看的Flutter组件演示'), findsOneWidget);

      // 验证页面有两个主要的选择卡片
      expect(find.byType(Card), findsNWidgets(2));

      // 验证导航图标存在
      expect(find.byIcon(Icons.image), findsOneWidget);
      expect(find.byIcon(Icons.touch_app), findsOneWidget);
    });

    testWidgets('导航到图片及图标演示页面测试', (WidgetTester tester) async {
      // 构建应用
      await tester.pumpWidget(MyApp());

      // 点击图片及图标演示卡片
      await tester.tap(find.text('图片及图标演示'));
      await tester.pumpAndSettle(); // 等待导航动画完成

      // 验证已经导航到图片演示页面
      expect(find.text('图片及图标演示'), findsOneWidget);
      expect(find.text('图片Fit模式'), findsOneWidget);
      expect(find.text('图片颜色混合'), findsOneWidget);
      expect(find.text('图片重复模式'), findsOneWidget);
      expect(find.text('图标展示'), findsOneWidget);

      // 验证返回按钮存在
      expect(find.byIcon(Icons.arrow_back), findsOneWidget);
    });

    testWidgets('导航到交互组件演示页面测试', (WidgetTester tester) async {
      // 构建应用
      await tester.pumpWidget(MyApp());

      // 点击交互组件演示卡片
      await tester.tap(find.text('交互组件演示'));
      await tester.pumpAndSettle(); // 等待导航动画完成

      // 验证已经导航到交互组件页面
      expect(find.text('交互组件演示'), findsOneWidget);
      expect(find.text('单选开关（Radio）'), findsOneWidget);
      expect(find.text('三态复选框（Checkbox）'), findsOneWidget);
      expect(find.text('复选框组（Checkbox Group）'), findsOneWidget);
      expect(find.text('开关组件（Switch）'), findsOneWidget);

      // 验证返回按钮存在
      expect(find.byIcon(Icons.arrow_back), findsOneWidget);
    });

    testWidgets('图片演示页面选项卡切换测试', (WidgetTester tester) async {
      // 构建应用并导航到图片演示页面
      await tester.pumpWidget(MyApp());
      await tester.tap(find.text('图片及图标演示'));
      await tester.pumpAndSettle();

      // 默认应该在第一个选项卡（图片Fit模式）
      // 验证选项卡按钮存在
      expect(find.text('图片Fit模式'), findsOneWidget);
      expect(find.text('图片颜色混合'), findsOneWidget);

      // 点击图片颜色混合选项卡
      await tester.tap(find.text('图片颜色混合'));
      await tester.pump();

      // 验证选项卡已切换（这里主要验证不会崩溃）
      expect(find.text('图片颜色混合'), findsOneWidget);

      // 点击图标展示选项卡
      await tester.tap(find.text('图标展示'));
      await tester.pump();

      // 验证图标展示内容
      expect(find.text('内置图标（Material Icons）'), findsOneWidget);
      expect(find.text('自定义图标（iconfont）'), findsOneWidget);
    });

    testWidgets('交互组件功能测试', (WidgetTester tester) async {
      // 构建应用并导航到交互组件页面
      await tester.pumpWidget(MyApp());
      await tester.tap(find.text('交互组件演示'));
      await tester.pumpAndSettle();

      // 测试单选按钮功能
      expect(find.text('选中的水果：苹果'), findsOneWidget);

      // 点击第二个单选按钮（香蕉）
      await tester.tap(find.text('香蕉'));
      await tester.pump();

      // 验证选择已更改
      expect(find.text('选中的水果：香蕉'), findsOneWidget);

      // 测试三态复选框
      expect(find.text('当前状态：未确定'), findsOneWidget);

      // 点击三态复选框
      final triStateCheckbox = find.byType(Checkbox).first;
      await tester.tap(triStateCheckbox);
      await tester.pump();

      // 验证状态已更改
      expect(find.text('当前状态：已选中'), findsOneWidget);

      // 测试Switch开关
      expect(find.text('夜间模式已关闭'), findsOneWidget);

      // 点击Switch开关
      await tester.tap(find.byType(Switch).first);
      await tester.pump();

      // 验证开关状态已更改
      expect(find.text('夜间模式已开启'), findsOneWidget);
    });

    testWidgets('复选框组功能测试', (WidgetTester tester) async {
      // 构建应用并导航到交互组件页面
      await tester.pumpWidget(MyApp());
      await tester.tap(find.text('交互组件演示'));
      await tester.pumpAndSettle();

      // 初始状态应该是无选中
      expect(find.text('选中的爱好：无'), findsOneWidget);

      // 点击第一个爱好（运动）
      await tester.tap(find.text('运动'));
      await tester.pump();

      // 验证选择已更新
      expect(find.text('选中的爱好：运动'), findsOneWidget);

      // 点击第二个爱好（音乐）
      await tester.tap(find.text('音乐'));
      await tester.pump();

      // 验证多选功能
      expect(find.text('选中的爱好：运动, 音乐'), findsOneWidget);

      // 测试全选功能
      await tester.tap(find.text('全选'));
      await tester.pump();

      // 验证全选功能
      expect(find.text('选中的爱好：运动, 音乐, 编程'), findsOneWidget);
    });

    testWidgets('返回导航测试', (WidgetTester tester) async {
      // 构建应用并导航到图片演示页面
      await tester.pumpWidget(MyApp());
      await tester.tap(find.text('图片及图标演示'));
      await tester.pumpAndSettle();

      // 验证在图片演示页面
      expect(find.text('图片及图标演示'), findsOneWidget);

      // 点击返回按钮
      await tester.tap(find.byIcon(Icons.arrow_back));
      await tester.pumpAndSettle();

      // 验证已返回主页面
      expect(find.text('选择演示类型'), findsOneWidget);
      expect(find.text('请选择您想要查看的Flutter组件演示'), findsOneWidget);
    });

    testWidgets('应用主题和样式测试', (WidgetTester tester) async {
      // 构建应用
      await tester.pumpWidget(MyApp());

      // 验证应用标题
      expect(find.text('Flutter 综合演示'), findsOneWidget);

      // 验证Material Design主题应用正确
      final materialApp = tester.widget<MaterialApp>(find.byType(MaterialApp));
      expect(materialApp.title, 'Flutter 综合演示');
      expect(materialApp.theme?.primarySwatch, Colors.blue);

      // 验证AppBar存在
      expect(find.byType(AppBar), findsOneWidget);

      // 验证主页面布局元素
      expect(find.byType(Container), findsWidgets);
      expect(find.byType(Column), findsWidgets);
    });

    testWidgets('边界情况和错误处理测试', (WidgetTester tester) async {
      // 构建应用并导航到图片演示页面
      await tester.pumpWidget(MyApp());
      await tester.tap(find.text('图片及图标演示'));
      await tester.pumpAndSettle();

      // 测试快速切换选项卡不会崩溃
      await tester.tap(find.text('图片颜色混合'));
      await tester.pump();
      await tester.tap(find.text('图片重复模式'));
      await tester.pump();
      await tester.tap(find.text('图标展示'));
      await tester.pump();
      await tester.tap(find.text('图片Fit模式'));
      await tester.pump();

      // 验证应用仍然正常运行
      expect(find.text('图片及图标演示'), findsOneWidget);
    });
  });
}

extension on ThemeData? {
  get primarySwatch => null;
}
